package edu.eam.gruposenior.gestorLEcciones.controladores;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.EntityManager;

import edu.eam.gruposenior.gestorLEcciones.entidades.CategoriaSubcategoria;
import edu.eam.gruposenior.gestorLEcciones.entidades.LeccionAprendida;
import edu.eam.gruposenior.gestorLEcciones.entidades.Proyecto;
import edu.eam.gruposenior.gestorLEcciones.entidades.Usuario;
import edu.eam.gruposenior.gestorLEcciones.util.FactoryEntityManager;

public class LeccionController {

	private EntityManager em = FactoryEntityManager.getEm();

	public void crearLeccion(String descripcion, Date fecha,
			LeccionAprendida leccionPadre, int iteracion, String nombre,
			String pasosSolucion, String referencias, String solucion,
			CategoriaSubcategoria categoriaSubcategoria, Proyecto proyecto,
			Usuario reportedor) {

		LeccionAprendida lecciPadre = null;

		if (leccionPadre != null) {
			lecciPadre = buscarLeccion(leccionPadre.getId());
		}

		LeccionAprendida leccion = new LeccionAprendida();

		leccion.setDescripcion(descripcion);
		leccion.setFecha(fecha);
		leccion.setIteracion(iteracion);
		leccion.setNombre(nombre);
		leccion.setLeccionPadre(leccionPadre);
		leccion.setPasosSolucion(pasosSolucion);
		leccion.setReferencias(referencias);
		leccion.setSolucion(solucion);
		leccion.setCategoriaSubcategoria(categoriaSubcategoria);
		leccion.setProyectoBean(proyecto);
		leccion.setUsuario(reportedor);

		if (leccionPadre != null) {
			lecciPadre.getLecciones().add(leccion);
		}

		FactoryEntityManager.getEm().persist(leccion);

		if (leccionPadre != null) {
			FactoryEntityManager.getEm().merge(lecciPadre);
		}

	}

	public LeccionAprendida crearLeccion(LeccionAprendida leccion) {

		em.getTransaction().begin();
		em.persist(leccion);
		em.getTransaction().commit();
                em.refresh(leccion);
                
                return leccion;
	}

	public void editarLeccion(Long id, String descripcion, Date fecha,
			LeccionAprendida leccionPadre, int iteracion, String nombre,
			String pasosSolucion, String referencias, String solucion,
			CategoriaSubcategoria categoriaSubcategoria, Proyecto proyecto,
			Usuario reportedor) throws Exception {

		LeccionAprendida leccion = buscarLeccion(id);

		if(leccion!=null){
		em.getTransaction().begin();

		leccion.setDescripcion(descripcion);
		leccion.setFecha(fecha);
		leccion.setIteracion(iteracion);
		leccion.setNombre(nombre);
		leccion.setLeccionPadre(leccionPadre);
		leccion.setPasosSolucion(pasosSolucion);
		leccion.setReferencias(referencias);
		leccion.setSolucion(solucion);
		leccion.setCategoriaSubcategoria(categoriaSubcategoria);
		leccion.setProyectoBean(proyecto);
		leccion.setUsuario(reportedor);

		em.merge(leccion);

		em.getTransaction().commit();
		}else{
			throw new Exception("No existe la leccion Aprendida");
		}
	}

	public LeccionAprendida buscarLeccion(Long id) {
		return em.find(LeccionAprendida.class, id);
	}

	public void replayLeccion() {

	}

	public List<LeccionAprendida> leccionesDeLeccion(Long id) {
		return em
				.createNamedQuery(
						LeccionAprendida.FIND_LECCION_APRENDIDA_BY_LECCION_PADRE)
				.setParameter(LeccionAprendida.PARAMETRO_LECCION_PADRE, id)
				.getResultList();
	}

	public List<LeccionAprendida> leciones() {
		return em.createNamedQuery(LeccionAprendida.FIND_ALL).getResultList();
	}

	public List<LeccionAprendida> leeccionesCategoria(Long id) {
		return em
				.createNamedQuery(
						LeccionAprendida.FIND_LECCION_APRENDIDA_BY_CATEGORIA)
				.setParameter(LeccionAprendida.PARAMETRO_CATEGORIA, id)
				.getResultList();
	}

}
